#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

int ticket=100;    //总票数

void* Scaple(void*arg)
{
  //线程入口函数，用来实现抢票
  pthread_mutex_t *mutex=(pthread_mutex_t*)arg;    //类型强转
  
  while(1){
    pthread_mutex_lock(mutex);   //进行加锁 --- 判断有没有票和抢票过程保证原子性
    if(ticket>0){
       usleep(10);
       printf("%p 抢到了 %d 号票\n",pthread_self(),ticket);
       ticket--;
       pthread_mutex_unlock(mutex);      //抢票结束，释放锁资源
    }else {
      printf("没有票了!-----%p 工作结束！\n",pthread_self());
      pthread_mutex_unlock(mutex);     //没有抢到票，也要释放锁资源
      //return NULL;
      pthread_exit(NULL);      //线程退出
    }
   usleep(5);     //避免时间片一直在一个线程处，导致其他线程无法工作
  }
}

int main()
{
  pthread_t tid[4];
  //定义互斥锁
  pthread_mutex_t mutex;
  
  pthread_mutex_init(&mutex,NULL);    //初始化互斥锁

  int i=0;
  for(i=0;i<4;++i){
    //int ret = pthread_create(&tid[i],NULL,Scaple,NULL);          //创建四个线程用来抢票
    int ret = pthread_create(&tid[i],NULL,Scaple,&mutex);          //创建四个线程用来抢票,传入同一个锁资源
    if(ret!=0){
       perror("pthread_create error!\n");
       return -1;
     }
  }


  //线程等待
  for(i=0;i<4;++i){
    pthread_join(tid[i],NULL);
  }
 
//程序结束之前，释放锁资源
  pthread_mutex_destroy(&mutex); 
  return 0;
}
